/* A simple server in the internet domain using TCP
   The port number is passed as an argument */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h> 
#include <sys/socket.h>
#include <netinet/in.h>

void error(const char *msg)
{
    perror(msg);
    exit(1);
}

int main(int argc, char *argv[])
{
	int sockfd, newsockfd1, newsockfd, portno;
	socklen_t clilen;
	char buffer[256];
	struct sockaddr_in serv_addr, cli_addr;
	int n;
	
	if (argc < 2) {
		fprintf(stderr,"ERRO, porta não informada.\n");
		exit(1);
	}
	
	sockfd = socket(AF_INET, SOCK_STREAM, 0);
	
	if (sockfd < 0) 
		error("Erro ao abrir SOCKET.");
	
	bzero((char *) &serv_addr, sizeof(serv_addr));
	portno = atoi(argv[1]);
	
	serv_addr.sin_family = AF_INET;
	serv_addr.sin_addr.s_addr = INADDR_ANY;
	serv_addr.sin_port = htons(portno);
	
	if (bind(sockfd, (struct sockaddr *) &serv_addr,
	  sizeof(serv_addr)) < 0) 
	  error("ERRO no binding");
	
	// Recebendo mensagem
	
	listen(sockfd,5);
	clilen = sizeof(cli_addr);
	newsockfd1 = accept(sockfd, 
		 (struct sockaddr *) &cli_addr, 
		 &clilen);
	
	if (newsockfd1 < 0) 
		error("ERRO no accept");
	
	bzero(buffer,256);
	n = read(newsockfd1,buffer,255);
	
	if (n < 0) 
		error("ERROR reading from socket");
		
	printf("\n\n	Mensagem recebida: %s\n",buffer);
	
	n = write(newsockfd1,"Mensagem recebida com sucesso pelo SERVIDOR.", 44);
	
	if (n < 0) error("ERRO ao escrever no SOCKET.");
		close(newsockfd1);
	// ---------------------------------------------

	/*// Recebendo destinatario
	
	listen(sockfd,5);
	clilen = sizeof(cli_addr);
	newsockfd = accept(sockfd, 
		 (struct sockaddr *) &cli_addr, 
		 &clilen);
	
	if (newsockfd < 0) 
		error("ERRO no accept");
	
	bzero(buffer,256);
	n = read(newsockfd,buffer,255);
	
	if (n < 0) 
		error("ERROR reading from socket");
		
	printf("\n\n	Mensagem recebida: %s\n",buffer);
	
	n = write(newsockfd,"Mensagem recebida com sucesso pelo SERVIDOR.", 44);
	
	if (n < 0) error("ERRO ao escrever no SOCKET.");
		close(newsockfd);
	// ---------------------------------------------*/

	
	close(sockfd);
	
	return 0; 
}
